MySQL 是一种广泛使用的数据库管理系统,许多应用程序都使用它来存储和管理数据。在 Node.js 中,使用 MySQL 实现 CRUD 操作是非常常见的。掌握 Node.js MySQL CRUD 可以让你轻松创建和管理 Web 应用程序,这对于想要在后端开发领域取得成功的人来说是必不可少的技能。
本篇笔记提供了使用 Node.js 包 mysql2 读写 MySQL 的详细示例和关键步骤。在示例中,我们主要关注以下方面:
- 如何建立和关闭 MySQL 的连接
- 如何插入记录
- 如何读取记录
- 如何更新记录
- 如何删除记录
希望可以帮助你更好地理解使用 mysql2 包进行 MySQL 访问的过程。
mysql2
Node.js 访问 MySQL 时常用的包是 mysql,不过这个库目前尚不支持 MySQL 8.0;替代方案是使用库 mysql2,文档显示两者之间绝大多数的 API 是兼容的。
安装库 mysql2:
npm install mysql2
创建/关闭数据库连接
import mysql from "mysql2";
const connection = mysql.createConnection({
host: Config.mysql_host,
port: Config.mysql_port,
user: Config.mysql_user,
password: Config.mysql_password,
database: Config.mysql_db_example,
});
connection.connect();
......
connection.end();
MySQL 连接属性:
- IP 地址或域名(Config.mysql_host)
- 端口(Config.mysql_port)
- 用户名(Config.mysql_user)
- 密码(Config.mysql_password)
- 数据库名称(Config.mysql_db_example)
Config.* 可替换成具体的值。
创建连接
connection.connect();
关闭连接
connection.end();
数据表
假设数据库 example 中存在一张名称为 user 的数据表,创建表语句:
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL DEFAULT '',
`age` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `name_UNIQUE` (`name`)
);
插入记录
插入一行记录
function createRow() {
const sql = "INSERT INTO user (name, age) VALUES (?, ?)";
const values = ["userA", 1];
connection.query(sql, values, (error, results) => {
if (error) {
throw error;
}
// 获取插入记录的行数
console.log("insert rows:", results.affectedRows);
// 获取插入记录的自增 ID
console.log("insert row id:", results.insertId);
});
}
插入记录是通过 connection.query 方法实现的,方法参数:
- SQL 语句(sql)
- SQL 参数值列表(values,可选)
- 回调函数((error, results) => {})
读取、更新和删除记录也是通过 connection.query 方法实现的。
注意:如果 SQL 语句中包含有参数,则 SQL 语句中的参数占位符(?)要和 SQL 参数值列表中的参数值一一对应。
回调函数含有两个参数:error 和 results。如果参数 error 不为 null,表示插入错误。可以使用 results.affectedRows 获取插入成功的记录数目(这里的值为1);如果数据表含有自增 ID,也可以使用 results.insertId 获取已插入记录的 ID 值。
插入多行记录
function createRows() {
const sql = "INSERT INTO user (name, age) VALUES ?";
const values = [
[
["userB", 2],
["userC", 3],
["userD", 4],
],
];
connection.query(sql, values, (error, results) => {
if (error) {
throw error;
}
// 获取插入记录的行数
console.log("insert rows:", results.affectedRows);
});
}
插入多行记录和插入一行记录实质上是一样的,需要注意的是多行记录场景下参数占位符和参数列表的使用,更多内容可以参考 Escaping query values。
读取记录
function readRows() {
const sql = "SELECT id, name, age from user WHERE id = ? OR name = ?";
const values = [1, "userB"];
connection.query(sql, values, (error, results, fields) => {
if (error) {
throw error;
}
console.log("read rows:", results.length);
results.forEach((row) => {
const id = row.id;
const name = row.name;
const age = row.age;
console.log(`id: ${id}, name: ${name}, age: ${age}`);
});
const names = fields.map((field) => field.name);
console.log("column names:", names);
});
}
读取记录的场景下,results 是一个数组,数组的一个元素就是一行记录。可以通过 results.length 获取读取的记录数目;通过遍历 results 获取每一行记录,每一行记录都是一个 Object,可以通过列名获取每一列的值。
读取记录的回调函数有一个特殊的参数 fields,它包含着记录的列信息,如:列名。
更新记录
function updateRows() {
const sql = "UPDATE user SET age = ? WHERE name = ?";
const values = [40, "userD"];
connection.query(sql, values, (error, results) => {
if (error) {
throw error;
}
// 获取更新记录的行数
console.log("update rows:", results.changedRows);
});
}
更新记录和插入记录类似,如果需要获取更新记录的行数,可以通过 results.changedRows。
关于 affectedRows 和 changedRows 的区别可以参考:Getting the number of affected rows 和 Getting the number of changed rows。
删除记录
function deleteRows() {
const sql = "DELETE FROM user WHERE age = ?";
const values = [40];
connection.query(sql, values, (error, results) => {
if (error) {
throw error;
}
// 获取删除记录的行数
console.log("delete rows:", results.affectedRows);
});
}
删除记录和更新记录类似,不再赘述。